package com.xiangxiao.rpan.storage.service;

import com.xiangxiao.rpan.storage.dto.FileListConfigDto;
import com.xiangxiao.rpan.storage.dto.StorageSourceDto;
import com.xiangxiao.rpan.storage.entity.StorageSource;
import com.xiangxiao.rpan.storage.entity.StorageSourceConfig;
import com.xiangxiao.rpan.storage.entity.SupportStorage;
import com.xiangxiao.rpan.storage.enums.StorageTypeEnum;
import com.xiangxiao.rpan.storage.vo.StorageSourceConfigVo;
import com.xiangxiao.rpan.storage.vo.StorageSourceVo;

import java.util.List;

/**
 * @auther xiangxiao
 * @email 573768011@qq.com
 * @data 2023/6/30 17:03
 */
public interface StorageSourceService {
  /**
   * 获取全局可用的存储资源列表
   * */
  List<StorageSourceVo> findAllEnableOrderByOrderNum();

  /**
   * 获取当前设置的存储源列表
   * @return 存储源列表
   */
  List<StorageSource> findAllOrderByOrderNum();

  /**
  * 获取所有可用支持的存储源
  * */
  List<SupportStorage> getSupportStorages();

  /**
   * 根据 id 获取指定存储源的类型.
   * @param   id
   *          存储源 ID
   * @return  存储源对应的类型.
   */
  StorageTypeEnum findStorageTypeById(Integer id);

  /**
   * 根据 id 获取指定存储源
   * @param   id
   *          存储源 ID
   * @return  存储源
   */
  StorageSource findById(Integer id);

  /**
   * 根据存储源 ID 查询存储源拓展配置, 并按照存储源 id 排序
   * @param   storageId
   *          存储源 ID
   * @return  存储源拓展配置列表
   */
  List<StorageSourceConfig> selectStorageConfigByStorageId(Integer storageId);


  /**
   * 根据存储源 Key 查询存储源拓展配置, 并按照存储源 id 排序
   * @param   storageKey
   *          存储源 ID
   * @return  存储源拓展配置列表
   */
  List<StorageSourceConfig> selectStorageConfigByStorageKey(String storageKey);
  /**
   * 判断存储源 key 是否已存在 (不读取缓存)
   * @param   storageKey
   *          存储源 key
   * @return  是否已存在
   */
  boolean existByStorageKey(String storageKey);


  /**
   * 根据存储源 key 获取存储源
   * @param   storageKey
   *          存储源 key
   * @return  存储源信息NS
   */
  StorageSource findByStorageKey(String storageKey);

  /**
   * 保存存储源基本信息及其对应的参数设置
   * @param   storageSourceDto
   *          存储源 DTO 对象
   * @return 存储源id
   */
  Integer saveStorageSource(StorageSourceDto storageSourceDto);

  /**
   * 获取指定存储源 DTO 对象, 此对象包含详细的参数设置.
   * @param   id
   *          存储源 ID
   * @return  存储源 DTO
   */
  StorageSourceDto findDTOById(Integer id);

  /**
   * 按传入的storageSource 实体的字段修改存储源
   * @param entity 传入的storageSource实体
   * **/
  void updateById(StorageSource entity);

  /**
   * 根据存储源 key 获取存储源 id
   * @param   storageKey
   *          存储源 key
   * @return  存储源信息
   */
  Integer findIdByKey(String storageKey);

  /**
   * 删除指定存储源设置, 同时会级联删除其参数设置
   * @param   id
   *          存储源 ID
   */
  StorageSource deleteStorageById(Integer id);

  /**
   * 据存储源的key去修改其id(修改表t_storage_source_config)
   * */
  void updateStorageSourceConfigId(String key, Integer storageId);


  /**
   * 获取存储源设置
   * 获取某个存储源的设置信息, 包括是否启用, 名称, 存储源类型, 存储源配置信息
   */
  StorageSourceConfigVo getStorageConfigSource(FileListConfigDto fileListConfigDto);
}
